Programmable integrated circuits (ICs) may be programmed by a user to perform specified logic functions. One type of programmable IC, known as a field programmable gate array (FPGA), typically includes programmable logic resources that are arranged in an array of programmable tiles including, for example, input/output blocks (IOBs), configurable logic blocks (CLBs), dedicated random access memory blocks (BRAM), multipliers, digital signal processing blocks (DSPs), processors, clock managers, delay lock loops (DLLs), bus or network interfaces such as Peripheral Component Interconnect Express (PCIe) and Ethernet and so forth.
Programmable ICs provide flexible hardware solutions that are advantageous for high performance parallel computing in advanced digital communications and video applications. For many complex applications, it may be desirable to implement a software portion of the design in software and a hardware portion of the design using programmable logic resources. Programmable ICs include one or more embedded processors to execute the software portion and programmable logic resources to implement circuits described by the hardware portion. Embedded processor systems often include operating memory, software instruction storage, input/output, and other components of a computer system. These systems are referred to as system on chip (SOC) solutions. In these systems, designers may implement complex functions in programmable logic to increase efficiency and throughput. This architectural combination gives an advantageous mix of serial and parallel processing, flexibility, and scalability, thereby enabling a more optimized system partitioning.
Current SOC digital hardware design is done using hardware description languages (HDLs) such as Verilog and VHDL. These languages provide special constructs to handle the description of digital hardware-specific elements such as registers and clocks. While these languages are effective in describing hardware circuits, they provide little in the way of high-level abstractions to manage the complexity of modern designs. In contrast, modern software languages, and in particular object-oriented high-level languages (HLL) such as Java and C++ provide robust high-level constructs that are very effective at managing complexity and serve to improve designer productivity as well as design quality. Synthesizing compilers have been created to infer and perform hardware synthesis to generate hardware circuits configured to implement an HLL design. The ability to describe circuits using an HLL allows a designer to focus on the algorithms, rather than the implementation details.